import axios from "axios";
import store from "../store"; // 引入Vuex store

// 创建axios实例，并设置超时时间和基础URL
const request = axios.create({
  timeout: 30000,
  baseURL: process.env.VUE_APP_BASE_API,
});

// 添加请求拦截器
request.interceptors.request.use(
  function (config) {
    // 从Vuex获取Token
    const token = store.getters["auth/getToken"];

    // 如果存在Token，添加到请求头
    if (token) {
      config.headers["Authorization"] = `Bearer  ${token}`; // 注意 Bearer 后有空格
      console.log("最终请求头:", config.headers); // 确认Header是否正确
    }

    // 为请求添加重试配置
    config.retry = config.retry || 3; // 默认重试3次
    config.retryDelay = config.retryDelay || 1000; // 重试延迟1秒
    config.currentRetry = 0; // 当前重试次数
    return config;
  },
  function (error) {
    return Promise.reject(error);
  }
);

// 添加响应拦截器，处理超时重试和认证错误
request.interceptors.response.use(
  function (response) {
    return response;
  },
  function (error) {
    const config = error.config;
    const response = error.response;

    // 处理401未认证错误（Token失效或未提供）
    if (response && response.status === 401) {
      // 清除本地Token和Vuex状态
      store.dispatch("auth/logout");

      // 重定向到登录页
      if (window.location.pathname !== "/login") {
        window.location.href = "/login";
      }
    }

    // 处理超时重试
    if (!config || !config.retry) {
      return Promise.reject(error);
    }

    if (error.code === "ECONNABORTED" && config.currentRetry < config.retry) {
      config.currentRetry += 1;
      const delay = new Promise((resolve) => {
        setTimeout(() => resolve(), config.retryDelay);
      });
      return delay.then(() => request(config));
    }

    return Promise.reject(error);
  }
);

// 抽离出get和post方法，返回Promise以便调用者处理
const http = {
  get(url, params, options = {}) {
    return new Promise((resolve, reject) => {
      request
        .get(url, { params, ...options })
        .then((res) => {
          resolve(res.data);
        })
        .catch((error) => {
          console.error("GET请求错误:", error);
          reject(error);
        });
    });
  },

  post(url, data, options = {}) {
    return new Promise((resolve, reject) => {
      request
        .post(url, data, {
          headers: {
            "Content-Type": "application/json",
          },
          ...options,
        })
        .then((res) => {
          resolve(res.data);
        })
        .catch((error) => {
          console.error("POST请求错误:", error);
          reject(error);
        });
    });
  },
};

export default http;
